From 9b0990ce13e40678258afe75816cd5c21a1dbea4 Mon Sep 17 00:00:00 2001 From: "awilliam@xenbuild.aw" Date: Wed, 15 Nov 2006 11:34:31 -0700 Subject: [PATCH] [IA64] MCA support - fix timer issue, log size issue, and limit logs to dom0 Signed-off-by: Yutaka Ezaki Signed-off-by: Masaki Kanno Signed-off-by: Kazuhiro Suzuki --- linux-2.6-xen-sparse/include/asm-ia64/sal.h | 8 ++++---- xen/arch/ia64/linux-xen/mca.c | 10 ++++++++++ xen/arch/ia64/xen/fw_emul.c | 7 +++++-- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/linux-2.6-xen-sparse/include/asm-ia64/sal.h b/linux-2.6-xen-sparse/include/asm-ia64/sal.h index 0cda1c410b..9439b49d8b 100644 --- a/linux-2.6-xen-sparse/include/asm-ia64/sal.h +++ b/linux-2.6-xen-sparse/include/asm-ia64/sal.h @@ -699,16 +699,16 @@ ia64_sal_get_state_info (u64 sal_info_type, u64 *sal_info) struct ia64_sal_retval isrv; #ifdef CONFIG_XEN if (is_running_on_xen()) { - struct xencomm_mini xc_area[2]; - int nbr_area = 2; struct xencomm_handle *desc; - if (xencomm_create_mini(xc_area, &nbr_area, sal_info, - ia64_sal_get_state_info_size(sal_info_type), &desc)) + if (xencomm_create(sal_info, + ia64_sal_get_state_info_size(sal_info_type), + &desc, GFP_KERNEL)) return 0; SAL_CALL_REENTRANT(isrv, SAL_GET_STATE_INFO, sal_info_type, 0, desc, 0, 0, 0, 0); + xencomm_free(desc); } else #endif SAL_CALL_REENTRANT(isrv, SAL_GET_STATE_INFO, sal_info_type, 0, diff --git a/xen/arch/ia64/linux-xen/mca.c b/xen/arch/ia64/linux-xen/mca.c index 261e7a0174..2d221cd7f9 100644 --- a/xen/arch/ia64/linux-xen/mca.c +++ b/xen/arch/ia64/linux-xen/mca.c @@ -118,6 +118,12 @@ extern void setup_vector (unsigned int vec, struct irqaction *action); static ia64_mc_info_t ia64_mc_info; +#ifdef XEN +#define jiffies NOW() +#undef HZ +#define HZ 1000000000UL +#endif + #define MAX_CPE_POLL_INTERVAL (15*60*HZ) /* 15 minutes */ #define MIN_CPE_POLL_INTERVAL (2*60*HZ) /* 2 minutes */ #define CMC_POLL_INTERVAL (1*60*HZ) /* 1 minute */ @@ -1388,7 +1394,11 @@ static irqreturn_t ia64_mca_cpe_int_caller(int cpe_irq, void *arg, struct pt_regs *ptregs) { static int start_count = -1; +#ifdef XEN + static unsigned long poll_time = MIN_CPE_POLL_INTERVAL; +#else static int poll_time = MIN_CPE_POLL_INTERVAL; +#endif unsigned int cpuid; cpuid = smp_processor_id(); diff --git a/xen/arch/ia64/xen/fw_emul.c b/xen/arch/ia64/xen/fw_emul.c index ff024147a8..6a37f051c4 100644 --- a/xen/arch/ia64/xen/fw_emul.c +++ b/xen/arch/ia64/xen/fw_emul.c @@ -205,7 +205,7 @@ sal_emulator (long index, unsigned long in1, unsigned long in2, } break; case SAL_GET_STATE_INFO: - { + if (current->domain == dom0) { sal_queue_entry_t *e; unsigned long flags; struct smp_call_args_t arg; @@ -274,13 +274,16 @@ sal_emulator (long index, unsigned long in1, unsigned long in2, spin_unlock_irqrestore(&sal_queue_lock, flags); xfree(e); } + } else { + status = IA64_SAL_NO_INFORMATION_AVAILABLE; + r9 = 0; } break; case SAL_GET_STATE_INFO_SIZE: r9 = ia64_sal_get_state_info_size(in1); break; case SAL_CLEAR_STATE_INFO: - { + if (current->domain == dom0) { sal_queue_entry_t *e; unsigned long flags; struct smp_call_args_t arg; -- 2.30.2